package bch.rocketmq;

import java.nio.channels.FileChannel;

/**
 *  {@link java.nio.channels.FileChannel#map(FileChannel.MapMode, long, long)} mmap
 *  {@link java.util.concurrent.CompletableFuture} 提升同步双写性能(主从 刷盘 默认都是异步)
 *  CommitLog 多线程问题
 *      异步刷盘: 自旋锁
 *      同步刷盘: 重入锁
 *
 *
 *
 * 消息存储：首先明白消息如何落盘
 *      commitLog消息日志：消息主体以及元数据的存储主体，存储Producer端写入的消息主体内容,
 *      consumequeue逻辑消费队列：存储了commitLog的起始物理offset，目的是提高消息消费的性能。
 *      indexFile索引文件：提供了一种可以通过key或时间区间来查询消息的方法。
 *      config: 配置文件
 * 通信机制：底层netty实现，RocketMQ的高效很大一部分依赖于Netty通信协议机制。
 *      (1) Broker启动后需要完成一次将自己注册至NameServer的操作；随后每隔30s时间定时向NameServer上报Topic路由信息。
 *
 *      (2) 消息生产者Producer作为客户端发送消息时候，需要根据消息的Topic从本地缓存的TopicPublishInfoTable获取路由信息。如果没有则更新路由信息会从NameServer上重新拉取，同时Producer会默认每隔30s向NameServer拉取一次路由信息。
 *
 *      (3) 消息生产者Producer根据2）中获取的路由信息选择一个队列（MessageQueue）进行消息发送；Broker作为消息的接收者接收消息并落盘存储。
 *
 *      (4) 消息消费者Consumer根据2）中获取的路由信息，并再完成客户端的负载均衡后，选择其中的某一个或者某几个消息队列来拉取消息并进行消费。
 * 消息过滤：RocketMQ有别于其它MQ中间件，在Consumer端订阅消息时再做消息过滤的。
 * 负载均衡：RocketMQ中的负载均衡都在Client端完成，主要可以分为Producer端发送消息时候的负载均衡和Consumer端订阅消息的负载均衡。
 * 事务消息：RocketMQ采用了2PC的思想来实现了提交事务消息，同时增加一个补偿逻辑来处理二阶段超时或者失败的消息
 */
public class Desc {
    public static void main(String[] args) {

    }
}
